<?php

namespace App\Events;

use App\Models\BookChapter;
use App\Models\BookWord;
use App\Models\Book;
use App\Models\WordVideo;
use App\Utils\FileUtil;
use App\Utils\StringUtil;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Support\Facades\Log;

class BookChapterTxtChanged
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    /** @var \App\Models\BookChapter $bookChapter */
    public $bookChapter;

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct(BookChapter $bookChapter)
    {
        $this->bookChapter = $bookChapter;
    }

    public function handle()
    {
        // 直接执行事件逻辑
        $bookChapter = $this->bookChapter;

        $words = StringUtil::parseTextContent($bookChapter->book_txt);
        // 'paragraph' => '第一段',
        // 'enword' => 'hall',
        //  'cn_word' => '大殿',
        // 'word_class' => 'n.',
        //  'read_mark' => 'h-～all',
        //  'symbol' => 'hwe'
        //  'plot_remind' => '关联提醒'

        $paragraphs = [];
        $wordCt = 0;

        $bookWordIds = [];
        foreach($words as $item){
            if (!in_array($item['paragraph'], $paragraphs)){
                $paragraphs[] = $item['paragraph'];
            }

            $wordCt++;
            /** @var BookWord $bookWord */
            $bookWord = BookWord::firstOrCreate([
                'book_id' => $bookChapter->book_id,
                'book_chapter_id' => $bookChapter->id,
                'en_word' => $item['en_word'],
                'cn_word' => $item['cn_word'],
            ]);

            $bookWord->word_class = $item['word_class'];
            $bookWord->read_mark = $item['read_mark'];
            $bookWord->symbol = $item['symbol'];
            $bookWord->paragraph = $item['paragraph'];
            $bookWord->sort = $wordCt;
            $bookWord->plot_remind = $item['plot_remind'];

            //错误音节库
            $bookWord->error_syllable = $this->getErrorSyllable($item['read_mark']);

            //完善选项
            if (empty($bookWord->opt_two)){
                //英文音频
                $enFileName = 'book/chapter/en/' . md5($item['en_word']) . '.mp3';
                $bookWord->en_audio = FileUtil::getDomain($enFileName);;
                WordVideo::firstOrCreate([
                    'type' => 0,
                    'word' => $item['en_word'],
                    'video_url' => $bookWord->en_audio,
                ]);

                //中文音频
                $cnFileName = 'book/chapter/cn/' . md5($item['cn_word']) . '.mp3';
                $bookWord->cn_audio = '';//FileUtil::getDomain($cnFileName)
                //WordVideo::firstOrCreate([
                //  'type'=>1,
                //  'word'=>$parts[0],
                //  'video_url'=>  $bookWord->cn_audio
                //]);

                //根据词性随机分配另外3个选项
                $twoDesc = 'verb';
                $thrDesc = 'verb';
                $fourDesc = 'noun';
                if (strpos($item['word_class'], 'n.') !== false){
                    $twoDesc = 'verb';
                    $thrDesc = 'verb';
                    $fourDesc = 'adj';
                }elseif (strpos($item['word_class'], 'v.') !== false){
                    $twoDesc = 'noun';
                    $thrDesc = 'noun';
                    $fourDesc = 'adj';
                }elseif (strpos($item['word_class'], 'adj.') !== false){
                    $twoDesc = 'verb';
                    $thrDesc = 'verb';
                    $fourDesc = 'noun';
                }
                $bookWord->opt_two = $this->randDesc($twoDesc);
                $bookWord->opt_thr = $this->randDesc($thrDesc);
                $bookWord->opt_four = $this->randDesc($fourDesc);

            }

            $bookWord->save();

            $bookWordIds[] = $bookWord->id;
        }

        //删除章节多余的单词
        if (count($bookWordIds) > 0){
            BookWord::where([
                'book_id' => $bookChapter->book_id,
                'book_chapter_id' => $bookChapter->id,
            ])->whereNotIn('id', $bookWordIds)->delete();
        }elseif (count($bookWordIds) == 0){
            BookWord::where([
                'book_id' => $bookChapter->book_id,
                'book_chapter_id' => $bookChapter->id,
            ])->delete();
        }

        //更新章节单词数
        BookChapter::where('id', $bookChapter->id)->update([
            'word_ct' => $wordCt,
            'paragraphs' => json_encode($paragraphs)
        ]);

        //更新书本单词数
        $bookWordCt = BookChapter::where('book_id', $bookChapter->book_id)->sum('word_ct');
        Book::where('id', $bookChapter->book_id)->update(['word_ct' => $bookWordCt]);
    }

    /**
     * 获取分词首字母不同的单词
     * @param $str
     * @return string
     */
    public function getErrorSyllable($str)
    {
        // 替换“～”为空字符串
        $str = str_replace('～', '', $str);
        // 根据“-”分割成数组
        $parts = explode('-', $str);

        $errorSyllables = ['al', 'ble', 'cal', 'dal', 'fer', 'gor', 'nal', 'tion', 'tious', 'ple', 'ous'];

        $letterArr = [];
        foreach($parts as $part){
            $letterArr[] = substr($part, 0, 1);
        }

        $resultArr = [];
        foreach($errorSyllables as $errorSyllable){
            $firLetter = substr($errorSyllable, 0, 1);
            if (!in_array($firLetter, $letterArr)){
                $resultArr[] = $errorSyllable;
            }
        }
        if (count($resultArr) > 0){
            return $resultArr[rand(0, count($resultArr) - 1)];
        }

        return 'al';
    }

    public function randDesc($type = 'noun')
    {
        $noun = [
            '阳光',
            '月光',
            '星空',
            '云朵',
            '雨滴',
            '雪花',
            '微风',
            '雷电',
            '露珠',
            '雾气',
            '苹果',
            '香蕉',
            '葡萄',
            '西瓜',
            '米饭',
            '面条',
            '蛋糕',
            '牛奶',
            '咖啡',
            '茶叶',
            '山脉',
            '河流',
            '湖泊',
            '海洋',
            '沙漠',
            '森林',
            '草原',
            '岛屿',
            '峡谷',
            '火山',
            '熊猫',
            '老虎',
            '大象',
            '孔雀',
            '海豚',
            '蝴蝶',
            '蜜蜂',
            '燕子',
            '金鱼',
            '蟋蟀',
            '诗歌',
            '散文',
            '戏剧',
            '音乐',
            '舞蹈',
            '电影',
            '雕塑',
            '建筑',
            '陶瓷',
            '漆器',
            '哲学',
            '逻辑',
            '伦理',
            '心理',
            '经济',
            '货币',
            '贸易',
            '税收',
            '法律',
            '权利',
            '密码',
            '芯片',
            '网络',
            '数据',
            '程序',
            '算法',
            '云端',
            '智能',
            '能源',
            '电力',
            '石油',
            '煤炭',
            '钢铁',
            '塑料',
            '玻璃',
            '水泥',
            '布料',
            '木材',
            '金属',
            '橡胶',
            '基因',
            '细胞',
            '细菌',
            '病毒',
            '器官',
            '疫苗',
            '药品',
            '诊所',
            '病房',
            '纱布',
            '口罩',
            '轮椅',
            '拐杖',
            '针管',
            '绷带',
            '药丸',
            '胶囊',
            '体温',
            '血压',
            '血糖',
            '互联网',
            '区块链',
            '大数据',
            '云计算',
            '无人机',
            '机器人',
            '物联网',
            '电子书',
            '电视台',
            '广播站',
            '出版社',
            '博物馆',
            '音乐厅',
            '电影院',
            '游乐园',
            '动物园',
            '植物园',
            '水族馆',
            '科技馆',
            '天文台',
            '内燃机',
            '发电机',
            '核电站',
            '变压器',
            '离合器',
            '方向盘',
            '刹车片',
            '安全带',
            '安全帽',
            '工作服',
            '运动鞋',
            '羽绒服',
            '牛仔裤',
            '连衣裙',
            '防晒霜',
            '洗发水',
            '沐浴露',
            '洗衣液',
            '护手霜',
            '三棱镜',
            '幼儿园',
            '小学生',
            '中学生',
            '大学生',
            '研究生',
            '实验室',
            '显微镜',
            '望远镜',
            '温度计',
            '血压计',
            '心电图',
            '呼吸机',
            '救护车',
            '消防栓',
            '红绿灯',
            '监控器',
            '路由器',
            '存储器',
            '传感器',
            '数据库',
            '世界观',
            '价值观',
            '人生观',
            '方法论',
            '辩证法',
            '相对论',
            '进化论',
            '量子论',
            '基因组',
            '生物钟',
            '免疫力',
            '维生素',
            '蛋白质',
            '氨基酸',
            '染色体',
            '微生物',
            '抗生素',
            '胰岛素',
            '超声波',
            '心电图',
            '纪录片',
            '演唱会',
            '话剧院',
            '美术馆',
            '图书馆',
            '咖啡厅',
            '面包店',
            '服装店',
            '便利店',
            '地铁站',
            '飞机场',
            '火车站',
            '十字路',
            '立交桥',
            '斑马线',
            '信号灯',
            '停车场',
            '加油站',
            '充电桩',
            '垃圾箱',
            '人工智能',
            '太阳能板',
            '风力发电',
            '核反应堆',
            '智能手机',
            '电子设备',
            '北京烤鸭',
            '数据中心',
            '网络安全',
            '数字媒体',
            '社交媒体',
            '广播电视',
            '出版机构',
            '音乐殿堂',
            '电影艺术',
            '游乐设施',
            '动物世界',
            '植物科学',
            '科技展览',
            '天文观测',
            '图书馆藏',
            '博物陈列',
            '咖啡文化',
            '面包烘焙',
            '服装设计',
            '高速公路',
            '跨海大桥',
            '人行横道',
            '交通信号',
            '监控系统',
            '消防设施',
            '救护设备',
            '温度调节',
            '血压监测',
            '呼吸治疗',
            '疫苗研发',
            '蛋白质组',
            '氨基酸链',
            '染色体组',
            '维生素群',
            '免疫系统',
            '微生物群',
            '抗生素药',
            '胰岛素针',
            '超声技术',
            '心电图纸',
            '薄荷拿铁',
            '插花艺术',
            '扬州炒饭',
            '夫妻肺片',
            '虚拟现实',
            '增强现实',
            '生物识别',
            '基因编辑',
            '微生物组',
            '抗生素类',
            '胰岛素泵',
            '超声仪器',
            '心电监护',
            '松鼠鳜鱼',
            '麻婆豆腐',
            '红烧肘子',
            '过桥米线',
            '鱼香肉丝',
            '宫保鸡丁',
            '冰糖葫芦',
            '蜜汁叉烧',
            '有机化学',
            '无机化学',
            '物理化学',
            '分析化学',
            '量子通信',
            '基因序列',
            '纳米材料',
            '航天科技',
            '量子力学',
            '基因工程',
            '纳米技术',
            '航空航天',
            '青藏高原',
            '黄土高原',
            '云贵高原',
            '东北平原',
            '华北平原',
            '智能家具',
            '美式咖啡',
            '充电设备',
            '垃圾分类',
            '再生资源',
            '生态环境',
            '食品安全',
            '社会保障',
            '义务教育',
            '医疗保险',
            '养老保险',
            '移动支付',
            '电子货币',
            '网络购物',
            '共享经济',
            '数字经济',
        ];

        $verb = [
            '奔跑',
            '跳跃',
            '拍打',
            '踢踏',
            '拥抱',
            '推拉',
            '搬运',
            '投掷',
            '攀爬',
            '游泳',
            '诉说',
            '倾听',
            '争论',
            '协商',
            '歌唱',
            '朗读',
            '呼唤',
            '训斥',
            '赞美',
            '承诺',
            '思考',
            '分析',
            '记忆',
            '判断',
            '猜测',
            '理解',
            '相信',
            '怀疑',
            '领悟',
            '规划',
            '烹饪',
            '洗涤',
            '清扫',
            '缝补',
            '种植',
            '驾驶',
            '购物',
            '支付',
            '休息',
            '睡眠',
            '合作',
            '竞争',
            '帮助',
            '邀请',
            '拒绝',
            '服从',
            '领导',
            '选举',
            '抗议',
            '调解',
            '微笑',
            '哭泣',
            '愤怒',
            '恐惧',
            '喜爱',
            '憎恨',
            '感动',
            '羡慕',
            '安慰',
            '祝福',
            '学习',
            '教授',
            '写作',
            '绘画',
            '设计',
            '发明',
            '计算',
            '翻译',
            '编辑',
            '演奏',
            '生长',
            '衰退',
            '改变',
            '进化',
            '融合',
            '分裂',
            '扩大',
            '缩小',
            '提升',
            '降低',
            '启动',
            '关闭',
            '调整',
            '安装',
            '拆卸',
            '连接',
            '切断',
            '存储',
            '复制',
            '删除',
            '存在',
            '消失',
            '影响',
            '代表',
            '象征',
            '持续',
            '中断',
            '实现',
            '失败',
            '超越',
            '打电话',
            '发微信',
            '拍视频',
            '刷抖音',
            '订外卖',
            '看电视',
            '骑共享',
            '坐地铁',
            '开直播',
            '打游戏',
            '洗衣服',
            '拖地板',
            '倒垃圾',
            '擦窗户',
            '修水管',
            '换灯泡',
            '种花草',
            '喂宠物',
            '遛狗狗',
            '包饺子',
            '写作业',
            '读报告',
            '查资料',
            '编程序',
            '修电脑',
            '装软件',
            '吃外卖',
            '存文件',
            '备份盘',
            '删垃圾',
            '买股票',
            '炒外汇',
            '投基金',
            '还贷款',
            '买保险',
            '理赔款',
            '避风险',
            '缩开支',
            '增效益',
            '降成本',
            '反腐败',
            '保环境',
            '促发展',
            '维权益',
            '创文明',
            '献爱心',
            '助脱贫',
            '抗疫情',
            '测核酸',
            '戴口罩',
            '打疫苗',
            '量体温',
            '做康复',
            '挂急诊',
            '办住院',
            '取报告',
            '开药方',
            '动手术',
            '输液体',
            '做护理',
            '开会议',
            '签合同',
            '办手续',
            '交费用',
            '开发票',
            '报税收',
            '核账目',
            '管仓库',
            '理货架',
            '补库存',
            '跑市场',
            '谈合作',
            '拉赞助',
            '拓渠道',
            '推产品',
            '打广告',
            '做调研',
            '写方案',
            '改方案',
            '调参数',
            '做实验',
            '录数据',
            '测样本',
            '绘图表',
            '建模型',
            '写论文',
            '发期刊',
            '评职称',
            '带学生',
            '备教案',
            '演节目',
            '弹钢琴',
            '跳舞蹈',
            '唱歌曲',
            '拍照片',
            '剪视频',
            '画插画',
            '设计划',
            '造器械',
            '装设备',
            '指手画脚',
            '摇头晃脑',
            '抓耳挠腮',
            '摩拳擦掌',
            '捶胸顿足',
            '挤眉弄眼',
            '蹑手蹑脚',
            '手舞足蹈',
            '交头接耳',
            '左顾右盼',
            '东张西望',
            '昂首挺胸',
            '弯腰驼背',
            '点头哈腰',
            '洗耳恭听',
            '侧耳倾听',
            '闭目养神',
            '屏息凝神',
            '冥思苦想',
            '绞尽脑汁',
            '挑灯夜战',
            '奋笔疾书',
            '挥毫泼墨',
            '咬文嚼字',
            '斟字酌句',
            '精打细算',
            '量入为出',
            '开源节流',
            '投机取巧',
            '弄虚作假',
            '偷工减料',
            '欺上瞒下',
            '阿谀奉承',
            '趋炎附势',
            '落井下石',
            '煽风点火',
            '挑拨离间',
            '胡搅蛮缠',
            '强词夺理',
            '据理力争',
            '晓之以理',
            '动之以情',
            '言传身教',
            '耳提面命',
            '谆谆教诲',
            '口诛笔伐',
            '歌功颂德',
            '树碑立传',
            '招兵买马',
            '招贤纳士',
            '添砖加瓦',
            '除旧布新',
            '改头换面',
            '精耕细作',
            '刀耕火种',
            '拔苗助长',
            '浇水施肥',
            '除草灭虫',
            '收割晾晒',
            '脱粒归仓',
            '修桥补路',
            '架梁砌墙',
            '粉刷油漆',
            '通水接电',
            '敲敲打打',
            '缝缝补补',
            '洗洗涮涮',
            '煎炒烹炸',
            '蒸煮炖焖',
            '切剁削片',
            '揉面擀皮',
            '包馅捏褶',
            '起火开灶',
            '掌勺颠锅',
            '摆盘上菜',
            '调兵遣将',
            '排兵布阵',
            '鸣金收兵',
            '擂鼓助威',
            '摇旗呐喊',
            '走南闯北',
            '东奔西走',
            '跋山涉水',
            '翻山越岭',
            '漂洋过海',
            '安家落户',
            '成家立业',
            '娶妻生子',
            '养老送终',
            '寻医问药',
            '号脉开方',
            '扎针拔罐',
            '刮痧推拿',
            '望闻问切',
            '强身健体',
            '修身养性',
            '参禅悟道',
            '打坐冥想',
            '诵经念佛',
            '烧香拜佛',
        ];

        $adj = [
            '美丽的',
            '漂亮的',
            '丑陋的',
            '高大的',
            '矮小的',
            '强壮的',
            '瘦弱的',
            '年轻的',
            '年老的',
            '干净的',
            '肮脏的',
            '整齐的',
            '杂乱的',
            '明亮的',
            '黑暗的',
            '柔软的',
            '坚硬的',
            '光滑的',
            '粗糙的',
            '轻盈的',
            '善良的',
            '邪恶的',
            '真诚的',
            '虚伪的',
            '勇敢的',
            '胆小的',
            '坚强的',
            '脆弱的',
            '温柔的',
            '粗暴的',
            '热情的',
            '冷漠的',
            '开朗的',
            '忧郁的',
            '悲观的',
            '勤劳的',
            '懒惰的',
            '谦虚的',
            '骄傲的',
            '快乐的',
            '悲伤的',
            '兴奋的',
            '沮丧的',
            '愤怒的',
            '平静的',
            '紧张的',
            '轻松的',
            '害怕的',
            '惊喜的',
            '寂寞的',
            '满足的',
            '不安的',
            '疲惫的',
            '舒适的',
            '新鲜的',
            '腐烂的',
            '香甜的',
            '苦涩的',
            '酸涩的',
            '辛辣的',
            '浓郁的',
            '清淡的',
            '温暖的',
            '寒冷的',
            '凉爽的',
            '炎热的',
            '干燥的',
            '潮湿的',
            '潮湿的',
            '响亮的',
            '低沉的',
            '快速的',
            '缓慢的',
            '简单的',
            '复杂的',
            '重要的',
            '次要的',
            '特殊的',
            '普通的',
            '相同的',
            '不同的',
            '正确的',
            '错误的',
            '安全的',
            '危险的',
            '健康的',
            '虚弱的',
            '富裕的',
            '贫穷的',
            '自由的',
            '有限的',
            '公开的',
            '秘密的',
            '合理的',
            '荒谬的',
            '永久的',
            '临时的',
            '有效的',
            '无效的',
            '充足的',
            '形容词',
            '鲜艳的',
            '黯淡的',
            '丰满的',
            '干瘦的',
            '挺拔的',
            '佝偻的',
            '水润的',
            '干裂的',
            '光洁的',
            '斑驳的',
            '匀称的',
            '畸形的',
            '端庄的',
            '轻浮的',
            '质朴的',
            '华丽的',
            '素雅的',
            '花哨的',
            '严谨的',
            '散漫的',
            '精明的',
            '糊涂的',
            '宽厚的',
            '刻薄的',
            '耿直的',
            '圆滑的',
            '慷慨的',
            '吝啬的',
            '坚韧的',
            '娇气的',
            '勤恳的',
            '怠惰的',
            '贞洁的',
            '放荡的',
            '可靠的',
            '可疑的',
            '机敏的',
            '鲁莽的',
            '沉稳的',
            '浮躁的',
            '豁达的',
            '狭隘的',
            '激昂的',
            '消沉的',
            '欣慰的',
            '懊恼的',
            '焦灼的',
            '惬意的',
            '厌烦的',
            '着迷的',
            '鲜美的',
            '腥臭的',
            '芳醇的',
            '寡淡的',
            '酥脆的',
            '绵软的',
            '冰凉的',
            '滚烫的',
            '和煦的',
            '凛冽的',
            '嘹亮的',
            '嘶哑的',
            '急促的',
            '悠扬的',
            '浑浊的',
            '清澈的',
            '粘腻的',
            '滑爽的',
            '粘稠的',
            '稀薄的',
            '朦胧的',
            '透彻的',
            '尖锐的',
            '圆润的',
            '蓬松的',
            '板结的',
            '脆弱的',
            '牢固的',
            '陡峭的',
            '平坦的',
            '曲折的',
            '笔直的',
            '空旷的',
            '拥挤的',
            '稀疏的',
            '茂密的',
            '荒芜的',
            '肥沃的',
            '贫瘠的',
            '先进的',
            '落后的',
            '传统的',
            '创新的',
            '深奥的',
            '浅显的',
            '具体的',
            '抽象的',
            '正式的',
            '随意的',
            '神圣的',
            '红彤彤的',
            '绿油油的',
            '黄澄澄的',
            '白茫茫的',
            '黑黝黝的',
            '亮晶晶的',
            '光溜溜的',
            '毛茸茸的',
            '湿漉漉的',
            '干巴巴的',
            '热腾腾的',
            '冷冰冰的',
            '暖烘烘的',
            '凉丝丝的',
            '香喷喷的',
            '臭烘烘的',
            '软绵绵的',
            '滑腻腻的',
            '粘糊糊的',
            '脆生生的',
            '皱巴巴的',
            '圆滚滚的',
            '扁塌塌的',
            '空落落的',
            '乱糟糟的',
            '脏兮兮的',
            '破破烂的',
            '病殃殃的',
            '娇滴滴的',
            '羞答答的',
            '怯生生的',
            '呆愣愣的',
            '贼溜溜的',
            '醉醺醺的',
            '懒洋洋的',
            '急匆匆的',
            '慢悠悠的',
            '喘吁吁的',
            '笑吟吟的',
            '哭啼啼的',
            '怒冲冲的',
            '乐呵呵的',
            '悲戚戚的',
            '美滋滋的',
            '苦兮兮的',
            '甜丝丝的',
            '酸溜溜的',
            '辣嗖嗖的',
            '咸津津的',
            '淡乎乎的',
            '硬梆梆的',
            '轻飘飘的',
            '沉甸甸的',
            '胖墩墩的',
            '瘦筋筋的',
            '矮墩墩的',
            '高挑挑的',
            '满当当的',
            '齐整整的',
            '干净净的',
            '新崭崭的',
            '健朗朗的',
            '粗咧咧的',
            '文绉绉的',
            '野豁豁的',
            '稳当当的',
            '晃悠悠的',
            '颤巍巍的',
            '气鼓鼓的',
            '眼巴巴的',
            '直勾勾的',
            '孤零零的',
            '齐刷刷的',
            '紧巴巴的',
            '松垮垮的',
            '厚墩墩的',
            '薄溜溜的',
            '亮堂堂的',
            '阴森森的',
            '雾蒙蒙的',
            '水淋淋的',
            '火辣辣的',
            '油汪汪的',
            '灰扑扑的',
            '金灿灿的',
            '银闪闪的',
            '蓝莹莹的',
            '粉嘟嘟的',
            '紫微微的',
            '青幽幽的',
            '乱蓬蓬的',
            '静悄悄的',
            '闹哄哄的',
            '晕乎乎的',
            '傻愣愣的',
            '精明明地',
            '凶巴巴的',
            '蔫耷耷的',
            '活蹦蹦的',
            '死沉沉的',
        ];

        $rand = rand(0, 299);
        $desc = $noun[$rand];
        if ($type == 'noun'){
            $desc = $noun[$rand];
        }elseif ($type == 'verb'){
            $desc = $verb[$rand];
        }elseif ($type == 'adj'){
            $desc = $adj[$rand];
        }

        return $desc;
    }


    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        return new PrivateChannel('channel-name');
    }
}
